#include "FileTransmission.h"

#include "../util/util.h"
#include "../util/Log.h"


#include <fstream>
#include <iostream>


bool FileTransmission::downloadFile(Fifo &fileTransfer,std::string & fileName) {

	int BUFFSIZE = 300;
	int num;
	char buffer [ BUFFSIZE ];
	std::string pathRecibido = getPathDownloadedFile(fileName);

	//Creo el archivo para lectura
	std::ofstream archivoRecibido(pathRecibido.c_str(),std::ios::out | std::ios::binary | std::ios::trunc);

	//Sino se puede abrir devuelvo false
	if(!archivoRecibido ){
		Log::getInstance().log(getpid(), ">> No se pudo abrir el archivo", true);
		return false;
	}
	// Abro el fifo para lectura
	fileTransfer.abrir(true);
	//Mientras exista contenido en el fifo y no se produzca un error escribo la lectura al archivo destino.
	do{
		if ((num = fileTransfer.leer ( buffer , BUFFSIZE )) < 0){
			perror("read");
		}else {
			archivoRecibido.write(buffer,num);
		}
	}while(num>0);

	//Alcanzado el EOF cierro el archivo destino.
	archivoRecibido.close();
	//Ciero el fifo
	fileTransfer.cerrar () ;

	return true;
}

bool FileTransmission::uploadFile(Fifo &fileTransfer,std::string & fileName) {
	int size;
	char * memblock;

	//ios::ate para que el archivo se cree con el puntero de get al final.
	std::ifstream archivoEntrada(fileName.c_str() ,std::ios::binary | std::ios::ate);

	if(!archivoEntrada ){
		std::string msj= ">> No se pudo abrir el archivo" + fileName;
		Log::getInstance().log(getpid(),msj, true);
		return false;
	}

	//Como el puntero de get estaba al final obtengo el tamaño del archivo.
	size = archivoEntrada.tellg();
	//Creo un buffer en memoria para almacenar el archivo en memoria.
	memblock = new char [size];
	//Posiciono el puntero al inicio.
	archivoEntrada.seekg (0, std::ios::beg);
	//Leo el archivo a memoria en el bloque creado del tamaño correspondiente.
	archivoEntrada.read (memblock, size);

	//Abro el canal para escritura y escribo el archivo.
	fileTransfer.abrir(false);
	int sent = fileTransfer.escribir(memblock, size);

	//Cierro el archivo.
	archivoEntrada.close();

	// Cierro el canal.
	fileTransfer.cerrar() ;

	//Libero los recursos.
	delete[] memblock;

	//devuelve true si envie el archivo.
	return (sent == size);
}

